21. Merge Two Sorted Lists
合并两个有序链表
解题思路1
用双指针并建立新链表,分别比较依次放入。关联二路归并
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
|
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){ struct ListNode *p=(struct ListNode *)malloc(sizeof(struct ListNode)); struct ListNode *head=p,*p1=list1,*p2=list2; if(!p1 && !p2) return p1; else if(!p1) return p2; else if(!p2) return p1;
while(p1&&p2){ if(p1->val > p2->val){ p->next = p2; p2 = p2->next; } else if(p2->val > p1->val){ p->next = p1; p1 = p1->next; } else if(p1->val == p2->val){ p->next = p1; p1 = p1->next; p = p->next; p->next = p2; p2 = p2->next; } p = p->next; }
if(p1) p->next = p1; if(p2) p->next = p2;
p = head; head = head->next; free(p); return head; }
|
解题思路2
用递归分别返回较小节点依次向后遍历。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){ if(!list1) return list2; if(!list2) return list1; if(list1->val <= list2->val){ list1->next = mergeTwoLists(list1->next,list2); return list1; } if(list2->val <= list1->val){ list2->next = mergeTwoLists(list1,list2->next); return list2; } return list1; }
|
86. Partition List
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
|
struct ListNode* partition(struct ListNode* head, int x){ if(!head) return head; if(!head->next) return head;
typedef struct ListNode node; node *p=head; node *p1head=(node *)malloc(sizeof(node)); node *p2head=(node *)malloc(sizeof(node)); node *p1=p1head; node *p2=p2head; p1->next = NULL; p2->next = NULL;
while(p){ if(p->val >= x){ p2->next = p; p2 = p2->next; } else{ p1->next = p; p1 = p1->next; } p = p->next; }
p1->next = p2head->next; p2->next = NULL; return p1head->next; }
|