将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
归并思路。
设置哨兵位的解法。
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){
struct ListNode* head,* tail;
//设置哨兵位。
head = tail = (struct ListNode*)malloc(sizeof(struct ListNode));
tail->next = NULL;
while( list1 && list2 )
{
if((list1->val) < (list2->val))
{
tail->next = list1;
tail = tail->next;
list1 = list1->next;
}
else
{
tail->next = list2;
tail = tail->next;
list2 = list2->next;
}
}
if(list1)
{
tail->next = list1;
}
if(list2)
{
tail->next = list2;
}
struct ListNode* list = head->next;
free(head);
return list;
}
将判断放在前面节省运存。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){
if(list2 == NULL)
{ //如果另一个链表为空的情况。
return list1;
}
if(list1 == NULL)
{
return list2;
}
struct ListNode* head,* tail;
head = tail = NULL;
while( list1 && list2 )
{
if((list1->val) < (list2->val))
{
if(tail==NULL)
{ //第一次链接
head = tail = list1;
}
else
{
tail->next = list1;
tail = tail->next;
}
list1 = list1->next;
}
else
{
if(tail == NULL)
{
head = tail = list2;
}
else
{
tail->next = list2;
tail = tail->next;
}
list2 = list2->next;
}
}
if(list1)
{
tail->next = list1;
}
if(list2)
{ //如果list2不为空,需要将其连接至tail后面。
tail->next = list2;
}
return head;
}
以下将判断放在后面进行。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){
struct ListNode* head,* tail;
head = tail = NULL;
while( list1 && list2 )
{
if((list1->val) < (list2->val))
{
if(tail==NULL)
{ //第一次链接
head = tail = list1;
}
else
{
tail->next = list1;
tail = tail->next;
}
list1 = list1->next;
}
else
{
if(tail == NULL)
{
head = tail = list2;
}
else
{
tail->next = list2;
tail = tail->next;
}
list2 = list2->next;
}
}
if(list1)
{
if(tail == NULL)
{
return list1;
}
tail->next = list1;
}
if(list2)
{ //如果list2不为空,需要将其连接至tail后面。
if(tail == NULL)
{ //如果另一个链表为空的情况。
return list2;
}
tail->next = list2;
}
return head;
}
以下有问题,直接插入后面的。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){
struct ListNode* cur1 = list1;
struct ListNode* cur2 = list2;
struct ListNode* head;
if((list1==NULL)&&(list2==NULL))
{
return NULL;
}
else if(list1==NULL)
{
return list2;
}
else if(list2==NULL)
{
return list1;
}
if((list1->val) > (list2->val))
{
head = list2;
}
else
{
head = list1;
}
while( list1 && list2 )
{
if((list1->val) > (list2->val))
{
cur2 = cur2->next;
list2->next = list1;
list2 = cur2;
}
else
{
cur1 = cur1->next;
list1->next = list2;
list1 = cur1;
}
}
return head;
}