21. Merge Two Sorted Lists
Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution { 10 public: 11 ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { 12 ListNode* newHead = new ListNode(-1); 13 ListNode* tail = newHead; 14 15 while(l1 != NULL && l2 != NULL) 16 { 17 if(l1->val <= l2->val){ 18 tail->next = l1; 19 l1 = l1->next; 20 } 21 else{ 22 tail->next = l2; 23 l2 = l2->next; 24 } 25 tail =tail->next; 26 } 27 if(l1 != NULL){ 28 tail->next = l1; 29 }else if(l2 != NULL){ 30 tail->next = l2; 31 } 32 return newHead->next; 33 } 34 };
当我们得到两个链表中值较小的头节点并把它链接到已经合并的链表之后,两个链表剩余的结点依然是排序的,因此合并的步骤和之前的步骤是一样的。这就是典型的递归过程,我们可以定义递归函数完成这个合并过程。
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution { 10 public: 11 ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { 12 if(l1 == NULL) 13 return l2; 14 else if(l2 == NULL) 15 return l1; 16 17 ListNode* pMergedHead = NULL; 18 19 if(l1->val < l2->val) 20 { 21 pMergedHead = l1; 22 pMergedHead->next = mergeTwoLists(l1->next, l2); 23 } 24 else 25 { 26 pMergedHead = l2; 27 pMergedHead->next = mergeTwoLists(l1, l2->next); 28 } 29 return pMergedHead; 30 } 31 };