先创建一个指针指向第一个节点
dfs到最后一个节点,开始与第一个节点进行比较
class Solution {
public:
ListNode *t;
bool dfs(ListNode *cur)
{
if (cur == nullptr)
return true;
if (!dfs(cur->next)) return false;
if (t->val != cur->val) return false;
t = t->next;
return true;
}
bool isPalindrome(ListNode* head) {
t = head;
return dfs(head);
}
};
根据合并两个有序数组的思路,合并两个有序链表
不一样的是:通常情况下,合并两个有序数组需要O(n + m)的空间,而合并两个有序链表只需O(1)的空间,我们只需要修改节点的next指针,就能改变节点之间的顺序。而在连续的数组中,想要改变元素之间的顺序,只能进行元素的交换或者移动
问题是:如何确定最后链表的首元素?可以创建一个哨兵节点,使其next指向最后链表的首元素
class Solution {
public:
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
if (list1 == nullptr) return list2;
if (list2 == nullptr) return list1;
if (list1->val > list2->val) swap(list1, list2);
ListNode *pre1 = list1, *cur1 = nullptr;
if (pre1) cur1 = pre1->next;
ListNode *cur2 = list2;
while (cur1)
{
while (cur2 && cur2->val <= cur1->val)
{
ListNode *next2 = cur2->next;
pre1->next = cur2;
pre1 = cur2;
cur2->next = cur1;
cur2 = next2;
}
cout << cur1->val << '\n';
ListNode *next1 = cur1->next;
pre1 = cur1, cur1 = next1;
}
while (cur2)
{
pre1->next = cur2;
pre1 = cur2;
cur2 = cur2->next;
}
return list1;
}
};