又是一道牛客网的问题。
描述如下:
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
解题思路:
这题可以用插入排序的思想解决。如果不喜欢复杂的操作就创建一个新链表来对两个链表合并,否则可以使用其中一个链表作为插入的链表,不过那样会有很多节点断链以及修复链的操作,我使用的是新链表的方法,用空间换时间。
注:
由于在指针操作的过程中经常涉及到形参和实参的问题,在非指针操作中我们可以很容易区分,但是当时指针时常常是我们容易犯错的,这里就是注意到当用一个临时变量指向一个节点的Next指针时在对该临时变量分配内存是不会对节点的next指针分配内存的,而只是对临时变量分配内存,如果操作错误,就会造成段错误和内存泄露问题,所以特别需要注意,建议在遇到这种情况时使用直接p->next = malloc()操作的方式或使用二级指针来进行操作,而不是使用临时变量tmp=p->next,然后在tmp=malloc()的形式,这样就不容易出错了.
下面是该题的代码:
1 /* 2 struct ListNode { 3 int val; 4 struct ListNode *next; 5 ListNode(int x) : 6 val(x), next(NULL) { 7 } 8 };*/ 9 class Solution { 10 public: 11 ListNode* Merge(ListNode* pHead1, ListNode* pHead2) 12 { 13 14 if(pHead1 == NULL && pHead2 == NULL) 15 { 16 return NULL; 17 } 18 19 ListNode *merge_head,*merge_list; 20 merge_head = merge_list = (ListNode *)malloc(sizeof(ListNode)); 21 merge_head->next = NULL; 22 23 if(pHead1 != NULL && pHead2 != NULL) 24 { 25 if(pHead1->val < pHead2->val) 26 { 27 merge_head->val = pHead1->val; 28 pHead1 = pHead1->next; 29 } 30 else 31 { 32 merge_head->val = pHead2->val; 33 pHead2 = pHead2->next; 34 } 35 } 36 else if(pHead1 == NULL) 37 { 38 merge_head->val = pHead2->val; 39 pHead2 = pHead2->next; 40 41 } 42 else 43 {//pHead2 == NULL && pHead1 != NULL 44 merge_head->val = pHead1->val; 45 pHead1 = pHead1->next; 46 } 47 48 /* 在这里赋值,后面malloc分配内存改变不了next,只是改变形参。 49 * 在这里赋值,后面malloc分配内存改变不了next,只是改变形参。 50 * 在这里赋值,后面malloc分配内存改变不了next,只是改变形参。 51 * 重要的事情说三遍 52 */ 53 //merge_head = merge_head->next; 54 55 while(pHead1 != NULL && pHead2 != NULL) 56 { 57 merge_head->next = (ListNode *)malloc(sizeof(ListNode)); 58 59 if(pHead1->val < pHead2->val) 60 { 61 merge_head->next->val = pHead1->val; 62 pHead1 = pHead1->next; 63 } 64 else 65 { 66 merge_head->next->val = pHead2->val; 67 pHead2 = pHead2->next; 68 } 69 70 merge_head = merge_head->next; 71 72 } 73 74 while(pHead1 != NULL) 75 { 76 merge_head->next = (ListNode *)malloc(sizeof(ListNode)); 77 merge_head->next->val = pHead1->val; 78 pHead1 = pHead1->next; 79 merge_head = merge_head->next; 80 } 81 82 while(pHead2 != NULL) 83 { 84 merge_head->next = (ListNode *)malloc(sizeof(ListNode)); 85 merge_head->next->val = pHead2->val; 86 pHead2 = pHead2->next; 87 merge_head = merge_head->next; 88 } 89 90 return merge_list; 91 92 } 93 };