【发布时间】:2015-04-28 01:17:54
【问题描述】:
我在 C 语言课程考试前练习了一些算法问题,但我在这个不知道如何回答的问题上卡住了(至少 3 甚至 4 个小时):
你有两个已经排序的 circular 单链表,你必须合并它们并返回新 circular 链表的头部而不创建任何新的额外节点.返回的列表也应该排序。
节点结构为:
typedef struct Node {
int data;
struct Node* next;
} Node;
我尝试了很多方法(递归和非递归),但都没有解决问题。
感谢您的帮助。
【问题讨论】:
-
你熟悉归并排序吗?这基本上是合并步骤,可以在链表中就地完成。
-
您可以在最后一个节点断开两个列表(您知道它是最后一个,因为下一个节点的值较小)现在问题简化为合并到链表,这很容易做到。在它们再次合并后,通过指向第一个元素旁边的最后一个使其循环
-
你应该展示你认为最好的尝试。没有真正需要递归算法,但如果您愿意,它当然可以递归地编写。是什么让你跌倒?是循环链表吗?
-
@sasha 对于所有元素都具有相同值的链表(
1->1->1->1->...->1是有效的排序链表),此逻辑将失败。您需要标记头部并在到达时结束合并。 -
@Saita as amit 说如果所有元素都相同,请注意这种情况。您可以通过选择任何元素作为 head 来做到这一点,记下它的值并遍历列表,直到遇到不同的值或再次到达头部。如果你再次在头部结束,所有的值都是一样的。
标签: c algorithm singly-linked-list circular-list