题目:
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 ------来自LeetCode热题100道
示例:
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
输入:l1 = [], l2 = []
输出:[]
输入:l1 = [], l2 = [0]
输出:[0]
分析:
我一开始的想法就是选取list1或者list2作为基础,随后另一个链表对此链表进行排序插入,值得注意的是对头节点的插入,需要及时更新头结点,还有就是看到题目的时候最好把思路理清楚,以及可能发生的情况,不然这次我就是总是提交,发现检测点不通过的时候,再不停的改,这样很痛苦的。完后,看到官方的解答就是,建立空链表,然后list1和list2不断比较,小的值不断放入,这样的话,就是不需要写很多条件了,最后没有遍历完的链表,只需要继续插入即可。
代码:
struct ListNode* Creat()//建立节点
{
struct ListNode* p;
p = malloc(sizeof(struct ListNode));
p->next = NULL;
return p;
}
struct ListNode* Attach(struct ListNode* tempt,int ival)
{
struct ListNode* ahead = tempt;//保存此时头结点
struct ListNode* t = Creat();
t->val = ival;
//if(tempt == NULL) return NULL;
while(tempt != NULL)
{
if(tempt->next != NULL)//此时至少有两个节点
{
if(ival>=tempt->val && ival <=tempt->next->val)//在中间插入的情况
{
t->next = tempt->next;
tempt->next = t;
break;
}
else if(ival<tempt->val)//插入头结点前面的情况
{
t->next = tempt;
ahead = t;//更新头结点
break;
}
}
else if(tempt->next == NULL)//只有一个节点或者是尾结点的情况
{
if(ival<=tempt->val)
{
t->next = tempt;
ahead = t;
}
else tempt->next = t;
break;
}
tempt = tempt->next;
}
return ahead;
}
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
struct ListNode* L = NULL;
if(list1 != NULL)
{
L = list1;
while(list2 != NULL)
{
L = Attach(L,list2->val);
list2 = list2->next;
}
}
else if(list2 != NULL) return list2;
return L;
}
//官方示例
typedef struct ListNode ListNode;
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{
ListNode* l1 = list1;
ListNode* l2 = list2;
if(list1 == NULL&&list2==NULL)
{
return list1;
}
if(list1 == NULL)
{
return list2;
}
if(list2 == NULL)
{
return list1;
}
//创建一个新链表
ListNode* newhead = (ListNode*)malloc(sizeof(ListNode));
ListNode* newcur = newhead;
while(l1&&l2)
{
if(l1->val <= l2->val)
{
newcur->next = l1;
newcur = newcur->next;
l1 = l1->next;
}
else
{
newcur->next = l2;
newcur = newcur->next;
l2 = l2->next;
}
}
if(l1)
{
while(l1)//这里改成if应该会更好些
{
newcur->next = l1;
newcur = newcur->next;
l1 = l1->next;
}
}
else
{
while(l2)
{
newcur->next = l2;
newcur = newcur->next;
l2 = l2->next;
}
}
return newhead->next;
}