1、输入一个链表,输出该链表中倒数第k个结点
c++
class Solution
{
public:
ListNode * FindKthToTail(ListNode * pListHead, unsigned int k)
{
if (!pListHead || k <= 0) return nullptr;
int n = 0;
ListNode * cur = pListHead;
while (cur)
{
cur = cur->next;
++n;
}
if (n < k) return nullptr;
n -= k;
while (n--)
{
pListHead = pListHead->next;
}
return pListHead;
}
};
求链表倒数第k个值,即求正数n-k个值。
2、将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的
c++
class Solution
{
public:
ListNode * mergeTwoLists(ListNode * 11, ListNode * 12)
{
if (11 == nullptr)
{
return 12;
}
else if (12 == nullptr)
{
return 11;
}
else if (11->val < 12->val)
{
11->next = mergeTwoLists(11->next, 12);
return 11;
}
else
{
12->next = mergeTwoLists(11, 12->next);
return 12;
}
}
};
两个链表头部值较小的一个节点与剩下元素的 merge 操作结果合并。
3、对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。
c++
class PalindromeList {
public:
bool chkPalindrome(ListNode* A) {
if (A == NULL || A->next == NULL)
return true;
ListNode* slow, *fast, *prev, *cur, *nxt;
slow = fast = A;