问题描述:
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.
思路:
按照从小到大的顺序排列,最关键的指针是*cur,保存最后链表的方向,还有p、q两个指针分别对应的两个链表,最后返回的是头指针。在开始时要先判断头指针从哪一个链表开始,注意考虑两个链表为空的情况。
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode *p = l1;
ListNode *q = l2;
ListNode *cur = NULL;
ListNode *head = NULL;
if(l1 == NULL && l2 == NULL) return NULL;
if(l1 == NULL) return l2;
if(l2 == NULL) return l1;
while(p && q){
ListNode *curNode = NULL;
if(head == NULL)
{
if(p -> val < q -> val){
head = cur = p;
p = p -> next;
cur ->next = NULL;
}else{
head = cur = q;
q = q -> next;
cur -> next = NULL;
}
}
else{
if(p -> val < q -> val){
cur -> next = p;
cur = p;
p = p -> next;
cur -> next = NULL;
}else{
cur -> next = q;
cur = q;
q = q -> next;
cur -> next = NULL;
}
}
}
if(p){
cur -> next = p;
}else if(q){
cur -> next = q;
}
return head;
}
};
修改于2016/7/13
采用头插法合并链表是最简单的方法,代码如下:
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode node(INT_MIN);
ListNode *tail = &node;
while(l1 && l2){
if(l1 -> val < l2 -> val){
tail -> next = l1;
l1 = l1 -> next;
}else{
tail -> next = l2;
l2 = l2 -> next;
}
tail = tail -> next;
}
tail -> next = l1 ? l1 : l2;
return node.next;
}
};