3.16 合併兩個排序的連結串列
阿新 • • 發佈:2018-12-25
輸入兩個單調遞增的連結串列,輸出兩個連結串列合成後的連結串列,當然我們需要合成後的連結串列滿足單調不減規則。
方法一:(不開闢新的空間)
struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } }; class Solution { public: ListNode* Merge(ListNode* pHead1, ListNode* pHead2) { ListNode* head = NULL; do { if (NULL == pHead1) { head = pHead2; break; } if (NULL == pHead2) { head = pHead1; break; } ListNode* p = pHead1; ListNode* q = pHead2; ListNode* qPre = NULL; while (NULL != p && NULL != q) { if (p->val <= q->val) { ListNode* temp = p->next; p->next = q; q = p; if (qPre != NULL) { qPre->next = p; qPre = NULL; } p = temp; } else { if (NULL == q->next) { q->next = p; q = NULL; } else { qPre = q; q = q->next; } } } if (pHead1->val <= pHead2->val) { head = pHead1; } else { head = pHead2; } } while (0); return head; } };
測試一:
方法二: (開闢新的空間)
/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ class Solution { public: ListNode* Merge(ListNode* pHead1, ListNode* pHead2) { ListNode* head = NULL; do { if (NULL == pHead1) { head = pHead2; break; } if (NULL == pHead2) { head = pHead1; break; } ListNode* p = pHead1; ListNode* q = pHead2; ListNode* m = NULL; while (NULL != p && NULL != q) { if (p->val <= q->val) { if (m == NULL) { m = new ListNode(p->val); head = m; } else { m->next = new ListNode(p->val); m = m->next; } p = p->next; } else { if (m == NULL) { m = new ListNode(q->val); head = m; } else { m->next = new ListNode(q->val); m = m->next; } q = q->next; } } while (p != NULL) { m->next = new ListNode(p->val); p = p->next; m = m->next; } while (q != NULL) { m->next = new ListNode(q->val); q = q->next; m = m->next; } } while (0); return head; } };