合并不带头节点的升序链表,结果链表也是升序。leetcode21题?

1/**
2 * Definition for singly-linked list.
3 * struct ListNode {
4 * int val;
5 * struct ListNode *next;
6 * };
7 */
8
9 struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){
10 struct ListNode *p1=l1,*p2=l2,*r=l1,*s;
11
12 while(p1 && p2){
13 if( p1->val <= p2->val ){
14 s = p1->next;
15 r->next = p1;
16 r = p1;
17 p1 = s;
18 }
19 else{
20 s = p2->next;
21 r->next = p2;
22 r = p2;
23 p2 = s;
24 }
25 }
26
27 if(p1) p2 = p1;
28 while(p2){
29 s = p2->next;
30 r->next = p2;
31 printf("%d",r);
32 r = p2;
33 p2 = s;
34 }
35 return l1;
36}
结果正常,但是提交就会显示错误Line 30: Char 17: runtime error: member access within null pointer of type 'struct ListNode' (solution.c)

r初始化的时候指向了l1,在while(p2)里面用到了r的next,如果l1本身就是NULL,r怎么会有next了?

你可以尝试申请一个局部的结构体变量,然后用结构体变量的next指向l1,最后返回的是结构体变量的next指针就可以避免访问到NULL节点了.

***
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/

struct ListNode* mergeTwoLists( struct ListNode* l1 ,
struct ListNode* l2
)
{
struct ListNode head ;
struct ListNode* tail_node = NULL ;

head.next = NULL;
tail_node = &head;
while(1)
{
if((l1!=NULL)&&(l2!=NULL))
{
if(l1->val <= l2->val)
{
tail_node->next = l1 ;
tail_node = l1 ;
l1 = l1->next ;
tail_node->next = NULL ;
}
else
{
tail_node->next = l2 ;
tail_node = l2 ;
l2 = l2->next ;
tail_node->next = NULL ;
}
}
else if(l1!=NULL)
{
tail_node->next = l1 ;
tail_node = l1 ;
l1 = l1->next ;
tail_node->next = NULL ;
}
else if(l2!=NULL)
{
tail_node->next = l2 ;
tail_node = l2 ;
l2 = l2->next ;
tail_node->next = NULL ;
}
else
{
break;
}
}
return head.next;
}

/*
执行结果:
通过
显示详情
执行用时 :8 ms, 在所有 C 提交中击败了68.29% 的用户
内存消耗 :7.5 MB, 在所有 C 提交中击败了77.42%的用户
*/追问

懂了,空表的可能,这个点确实没想到。真是个精细活。

温馨提示:答案为网友推荐,仅供参考
相似回答