我有两个已排序的链表,list 1和list 2。我的目标是将list 2合并到list 1中。
所需经费如下:
1.结果列表应该是list 1(不创建新的链接列表,也不使合并列表位于新的链接列表中)
1.返回类型必须为void
1.合并后list 2必须为空
1.合并列表必须排序
1.无法删除或移除任何节点。仅移动指针
1.无递归
1.算法中不允许排序
1.无其他帮助函数
示例输出:
- 列表1:d -〉e -〉f -〉t -〉w -〉x -〉y -〉空
- 列表2:a -〉B -〉e -〉j -〉l -〉z -〉空
结果:
- 列表1:a -〉B -〉d -〉e-〉e -〉f -〉j -〉l -〉t -〉w -〉x -〉y -〉z -〉空
- 列表2:空
我的程式码结果目前是
- 列表1:d -〉e -〉f -〉j -〉l -〉t -〉w -〉x -〉y -〉z -〉空
- 列表2:a -〉B -〉d -〉e-〉e -〉f -〉j -〉l -〉t -〉w -〉x -〉y -〉z -〉空
typedef struct listNode {
char data;
struct listNode* nextPtr;
} ListNode;
typedef ListNode* ListNodePtr;
void mergeSortedList(ListNodePtr list1, ListNodePtr list2) {
ListNodePtr curr = NULL;
ListNodePtr last = NULL;
if (list1->data < list2->data)
{
curr = list1;
last = list1;
list1 = list1->nextPtr;
}
else {
curr = list2;
last = list2;
list2 = list2->nextPtr;
}
last->nextPtr = NULL;
while (list1 != NULL && list2 != NULL) {
if (list1->data < list2->data) {
last->nextPtr = list1;
last = list1;
list1 = list1->nextPtr;
}
else {
last->nextPtr = list2;
last = list2;
list2 = list2->nextPtr;
}
last->nextPtr = NULL;
}
if (list1 != NULL) {
last->nextPtr = list1;
}
else {
last->nextPtr = list2;
}
}
1条答案
按热度按时间ryevplcw1#
1.删除
ListNodePtr
,以支持ListNode *
(请参阅Is it a good idea to typedef pointers?)。1.正如@n.m.所暗示的,您需要传入
ListNode **
,以便对调用者产生影响。1.如果
list1
或list2
为NULL,则原始代码为segfaults。1.如果
*list1
没有指向最小的第一个节点,则交换这两个列表,然后使用指针l1
和l2
遍历这两个列表。有趣的例子是将节点从l2
移动到l1
。这需要您提前查看l1
m上的节点,以便将入站指针设置为要移动的节点。或者,在l1
上保留一个指针,指向当前节点的前一个节点。最后,处理l2
上剩余的节点。和结果输出: